Canigó - Servei de reporting 2.2
SERVEI DE REPORTING
IntroduccióPropòsitEl servei de Reporting de canigo permet integrar d'una manera senzilla dades des de fonts heterogènees i mostrar-les en diferents formats: PDF, XLS, CSV, RTF i HTML, dins d'un marc homogeni de desenvolupament. Context i Escenaris d'ÚsEl servei de Reporting es troba dins dels serveis de presentació de canigo. Versions i DependènciesLes dependències descrites a la següent url son requerides per tal de compilar i fer funcionar el projecte: A qui va dirigitAquest document va dirigit als següents perfils:
Documents i Fonts de Referència
GlossariJasperReports Descripció DetalladaArquitectura i Componentscanigo ofereix una arquitectura del servei de reporting totalment deslligada de qualsevol implementació. Els components podem classificar-los en:
JavaDoc: http://canigo.ctti.gencat.net/confluence/canigodocs/site/canigo2_0/canigo-services-reporting/apidocs/index.html Instal- lació i ConfiguracióInstal- lacióLa instal- lació del servei requereix de la utilització de la llibreria 'canigo-services-reporting' i les dependències indicades a l'apartat 'Introducció - Versions i Dependències'. ConfiguracióLa configuració del Servei de Reporting implica realitzar els següents pasos:
Definició de la Configuració Bàsica La configuració bàsica implica:
_ Fitxer de configuració: web.xml_ Definir que totes les URIs que finalitzin amb ".report" les tractarà canigo amb el servlet org.springframework.web.servlet.DispatcherServlet: Usar el següent codi:
... <servlet> <servlet-name>application</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet> ... <servlet-mapping> <servlet-name>application</servlet-name> <url-pattern>*.report</url-pattern> </servlet-mapping> ...
_ Fitxer de configuració: canigo-services-reporting.xml_ Configurar un bean amb un identificador (es recomana usar 'viewResolver' ) i els següents atributs:
Configurar les següents propietats:
Exemple:
... <!-- REPORTING service --> <bean id="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver" > <property name="location" value="classpath:reports/views.xml" /> </bean> ...
_ _ _ _ Definir un forward per cada format de renderització emprat, seguint el següent patró:
<forward name="report*<FORMAT>*" path="/view.report?contentType=<format>" redirect="true" /> Usar el següent codi: ... <global-forwards> ... <!-- Forward to report --> <forward name="reportPDF" path="/view.report?contentType=pdf" redirect="true" /> <forward name="reportXLS" path="/view.report?contentType=xls" redirect="true" /> <forward name="reportCSV" path="/view.report?contentType=csv" redirect="true" /> <forward name="reportHTML" path="/view.report?contentType=html" redirect="true" /> <forward name="reportRTF" path="/view.report?contentType=rtf" redirect="true" /> ... </global-forwards> ...
_ _ Definir el controlador a utilitzar en la renderització dels reports, per això s'ha de definir el següent bean: <bean id="reportingController" class="net.gencat.ctti.canigo.services.reporting.ReportingController" /> En la definició del bean "ExportInterceptor", a la propietat "redirections" s'ha d'afegir l'entrada:
<entry key="//.report" value="/view.report" />
En la definició del bean "urlMapping", a la propietat "mappings" s'ha d'afegir l'entrada: <prop key="view.report">reportingController</prop>
Exemple: ... <bean id="ExportInterceptor" class="net.gencat.ctti.canigo.services.web.spring. BufferedResponseSpringInterceptor"> <property name="redirections"> <map> ... <entry key="//.report" value="/view.report" />* </map> </property> </bean> <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> ... <property name="mappings"> <props> ... <prop key="view.report">reportingController</prop> </props> </property> </bean> ... <bean id="reportingController" class="net.gencat.ctti.canigo.services.reporting.ReportingController"/> Localització dels reports i el seu tipus de visualització ![]() _Fitxer de configuració: views.xml_ Ubicació proposada: <PROJECT_ROOT>/src/main/resources/reports La definició de cada report requereix configurar un bean amb un identificador (es recomana usar '<nom_report>Report' ) i els següents atributs: Atributs:
També es poden configurar les següents propietats:
Exemple:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd?"> <beans> ... <bean id="RotationReport" class="net.gencat.ctti.canigo.services.reporting.impl. WrapperJasperMultiFormatView" > <property name="url" value="classpath:reports/rotation/RotationReport.jrxml" /> </bean> <bean id="CustomersReport" class="net.gencat.ctti.canigo.services.reporting.impl. WrapperJasperMultiFormatView" > <property name="url" value="classpath:reports/customers/CustomersReport.jrxml" /> </bean> ... </beans> Utilització del Serveicanigo defineix 2 maneres d'integrar les dades d'un report:
Com exemple d'utilització del servei de Reporting s'inclou un exemple en el que es visualitza un report senzill. A continuació es mostren els pasos a seguir per integrar un report dins d'una aplicació: Realitzar el disseny del report
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="RotationReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30"> <title> <band height="782"> <staticText> <reportElement mode="Opaque" x="0" y="0" width="90" height="350" backcolor="#c0c0c0"/> <textElement rotation="Left"> <font size="14"/> </textElement> <text><![CDATA[rotation="Left" textAlignment="Left" verticalAlignment="Top"]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="100" y="0" width="90" height="350" backcolor="#c0c0c0"/> <textElement textAlignment="Center" verticalAlignment="Bottom" rotation="Left"> <font size="14"/> </textElement> <text><![CDATA[rotation="Left" textAlignment="Center" verticalAlignment="Bottom"]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="200" y="0" width="90" height="350" backcolor="#c0c0c0"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="Left"> <font size="14"/> </textElement> <text><![CDATA[rotation="Left" textAlignment="RIght" verticalAlignment="Middle"]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="255" y="410" width="90" height="350" forecolor="#ffffff" backcolor="#404040"/> <textElement textAlignment="Right" verticalAlignment="Middle" rotation="Right"> <font size="14"/> </textElement> <text><![CDATA[rotation="Right" textAlignment="RIght" verticalAlignment="Middle"]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="355" y="410" width="90" height="350" forecolor="#ffffff" backcolor="#404040"/> <textElement textAlignment="Center" verticalAlignment="Bottom" rotation="Right"> <font size="14"/> </textElement> <text><![CDATA[rotation="Right" textAlignment="Center" verticalAlignment="Bottom"]]></text> </staticText> <staticText> <reportElement mode="Opaque" x="455" y="410" width="90" height="350" forecolor="#ffffff" backcolor="#404040"/> <textElement rotation="Right"> <font size="14"/> </textElement> <text><![CDATA[rotation="Right" textAlignment="Left" verticalAlignment="Top"]]></text> </staticText> </band> </title> </jasperReport> Nota Per realitzar el disseny del report es recomana l'utilizació d'una eina visual tipus iReport. Veure l'apartat "Eines de Suport". Registrar el report en el servei (fitxer views.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> ... <bean id="RotationReport" class="net.gencat.ctti.canigo.services.reporting.impl. WrapperJasperMultiFormatView" > <property name="url" value="classpath:reports/rotation/RotationReport.jrxml" /> </bean> ... </beans> Modelar les dades a mostrar (opcional)Per renderitzar el report amb dades modelades per un Action, s'ha de definir específicament un Map i informar-lo amb parells "nom/valor" que el servei de reporting utilitzarà per omplir el report al visualitzar-lo.
/** * Modeling data for report */ public ActionForward reportRotation(Category vo, StrutsContext context) { // Get data for render report Map model = getModel(); // Save data in session context.getRequest().getSession().setAttribute(ReportingController. REPORTING_CONTROLLER_MODEL,model); // Set view name to render context.getRequest().getSession().setAttribute(ReportingController. REPORTING_CONTROLLER_REPORTID,"RotationReport"); // Forward to report Controller return context.getActionMapping().findForward("reportPDF"); } private Map getModel() { Map model = new HashMap(); Collection beanData = getData(); model.put("myBeanData", beanData); return model; } protected List getData() { List list = new ArrayList(); for (int x = 0; x < 10; x++) { Category bean = new Category(); bean.setId(""+x); bean.setName("canigo"); list.add(bean); } return list; } Nota Si el report utilitza el seu propi "data source" (o no mostra dades dinàmiques) no serà necessari realitzar aquest pas. Invocar el reportPer invocar el report dins de l'aplicació es pot realitzar mitjançant:
http://localhost:8080/canigo\-samples\-Petstore/categories.do?*reqCode=reportRotation\\\\\\\\\\\\\\*
http://localhost:8080/canigo\-samples\-Petstore*/view.report?contentType=pdf&reportId=RotationReport\\\\\\\\\\\\\\* Eines de SuportiReportEl disseny d'un report representa una plantilla que serà utilitzada pel servei per mostrar contingut dinàmic en el format escollit. Està definit en fitxers XML que han de tenir una estructura predefinida. Aquests XML s'han de compilar per poder realitzar les operacions d'omplir dades, aquesta tasca de compilació la realitza el servei de manera "on the fly". És aconsellable utilitzar una eina visual per realitzar el disseny dels reports, aquesta eina ha de facilitar l'edició de reports complexes amb gràfics, imatges, subreports, etc. Una eina que compleix tots aquests requisits és iReport http://ireport.sourceforge.net. Algunes de les característiques que proporciona iReport són:
|